package com.ccp.dev.form.service;

import com.ccp.dev.core.basic.base.BaseService;
import com.ccp.dev.core.basic.table.ColumnModel;
import com.ccp.dev.core.basic.web.query.QueryFilter;
import com.ccp.dev.core.util.BeanUtils;
import com.ccp.dev.form.dao.FormFieldDao;
import com.ccp.dev.form.model.FormField;
import com.ccp.dev.form.util.FieldPool;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * BPM_FORM_FIELD service类
 *
 * @author zhaowj
 */
@Service
public class FormFieldService extends BaseService<FormField> {

    @Resource
    private FormFieldDao formFieldDao;

    /**
     * 通过tableId查找
     *
     * @param tableId 自定义表Id
     * @return 字段集合
     */
    public List<FormField> getByTableId(String tableId) {
        return formFieldDao.getByTableId(tableId);
    }

    /**
     * 通过tableId获取所有字段（包括已删除的）
     * @param tableId
     * @return
     */
    public List<FormField> queryAllByTableId(String tableId){ return formFieldDao.queryAllByTableId(tableId);}

    /**
     * 查询表中加密字段信息
     *
     * @param tableId 自定义表Id
     * @return 字段集合
     */
    public List<FormField> getEncryptFieldByTableId(String tableId) {
        return formFieldDao.getEncryptFieldByTableId(tableId, FormField.ISENCRYPT);
    }

    /**
     * 通过tableId获取字段列表(包含隐藏的)
     *
     * @param tableId tableId
     * @return List<FormField> 集合
     */
    public List<FormField> getByTableIdContainHidden(String tableId) {
        return formFieldDao.getByTableIdContainHidden(tableId);
    }

    /**
     * 查询列表，不包含删除和隐藏字段的字段
     *
     * @param tableId 表id
     * @return List<FormField> 集合
     */
    public List<FormField> getByTableIdNoHidden(String tableId) {
        return formFieldDao.getByTableIdNoHidden(tableId);
    }


    /**
     * 根据字段在字段集合json串的顺序修改sn的值以达到给字段重新排序的目的
     *
     * @param jsonStr
     */
    public void updateFieldSn(String jsonStr, String tableId) {
        JSONArray jsonArray = JSONArray.fromObject(jsonStr);
        Map<String, Object> condition = new HashMap<>(3);
        condition.put("tableId", tableId);
        for (int i = 0; i < jsonArray.size(); i++) {
            condition.put("sn", i);
            JSONObject field = JSONObject.fromObject(jsonArray.get(i));
            condition.put("fieldName", field.get("name"));
            formFieldDao.updateFieldSn(condition);
        }
    }

    /**
     * 根据流程定义ID获取流程表单变量。
     *
     * @param procDefId,parentProcDefId
     * @return
     */
    public List<FormField> queryFormVarByFlowProcDefIdOrParentProcDefId(String procDefId,String parentProcDefId) {
        return formFieldDao.queryFormVarByFlowProcDefIdOrParentProcDefId(procDefId,parentProcDefId);
    }

    /**
     * 获取所有流程默认自带的变量
     *
     * @return
     */
    private List<FormField> getCommonFields() {
        List<FormField> list = new ArrayList<FormField>();

        FormField startUser = new FormField();
        startUser.setFieldName("startUser");
        startUser.setFieldDesc("发起人");
        startUser.setFieldType(ColumnModel.COLUMNTYPE_NUMBER);
        list.add(startUser);

        FormField businessKey = new FormField();
        businessKey.setFieldName("businessKey");
        businessKey.setFieldDesc("表单主键");
        businessKey.setFieldType(ColumnModel.COLUMNTYPE_VARCHAR);
        list.add(businessKey);

        FormField flowRunId = new FormField();
        flowRunId.setFieldName("flowRunId");
        flowRunId.setFieldDesc("流程运行ID");
        flowRunId.setFieldType(ColumnModel.COLUMNTYPE_INT);
        list.add(flowRunId);

        return list;
    }

    /**
     * 处理日期类型
     *
     * @param list
     */
    private void parseDateFormat(List<FormField> list) {
        if (BeanUtils.isEmpty(list)) {
            return;
        }
        for (FormField bpmFormField : list) {
            if (BeanUtils.isEmpty(bpmFormField.getCtlProperty())) {
                continue;
            }
            if (bpmFormField.getFieldType().equals(ColumnModel.COLUMNTYPE_DATE) || bpmFormField.getControlType().shortValue() == FieldPool.DATEPICKER) {
                this.setDateFormat(bpmFormField);
            }
        }
    }

    private void setDateFormat(FormField formField) {
        if (BeanUtils.isNotEmpty(formField.getCtlProperty())) {
            JSONObject json = JSONObject.fromObject(formField.getCtlProperty());
            String format = (String) json.get("format");
            formField.setDatefmt(format);
        }
    }

    /**
     * 获取流程变量
     *
     * @param procDefId,parentProcDefId
     * @return
     */
    public List<FormField> queryFlowVarByFlowProcDefIdOrParentProcDefId(String procDefId,String parentProcDefId) {
        List<FormField> list = queryFormVarByFlowProcDefIdOrParentProcDefId(procDefId,parentProcDefId);
        //添加所有流程默认自带的变量
        list.addAll(getCommonFields());
        //处理List日期格式
        parseDateFormat(list);
        return list;
    }

    /**
     * 根据流程定义ID获取流程变量。
     *
     * @param procDefId,parentProcDefId
     * @param excludeHidden 排除隐藏变量
     * @return
     */
    public List<FormField> queryFlowVarByFlowProcDefIdOrParentProcDefId(String procDefId,String parentProcDefId, boolean excludeHidden) {
        List<FormField> flowVars = new ArrayList<FormField>();
        //获取表单流程变量。
        List<FormField> list = queryFormVarByFlowProcDefIdOrParentProcDefId(procDefId,parentProcDefId);
        for (FormField field : list) {
            //排除重复，并且
            if (excludeHidden && field.isExecutorSelectorHidden()) {
                continue;
            }
            flowVars.add(field);
        }
        flowVars.addAll(getCommonFields());
        parseDateFormat(flowVars);
        return flowVars;
    }

    /**
     * 判断流水号是否存在依赖
     *
     * @param alias
     * @return
     */
    public List<FormField> queryBySerialNum(String alias) {
        return formFieldDao.queryBySerialNum(alias);
    }

}